/***************************************************************************
 创建者: 华磊
 开始时间: 2018.8.14
 copyright: (C) 华友高新
 修改说明: (每次有修改就添加一条，带有 修改人，修改时间，修改描述)
 example (1) 李文友 2017.5.8 类的具体实现代码编写

 ***************************************************************************
 *  @file x.h
 *  功能:
 *
 *                                                                         *
 ***************************************************************************/
#ifndef MESSAGELOG_H
#define MESSAGELOG_H


#include <QDateTime>
#include <QTranslator>
#include <QCoreApplication>
#include <qvector.h>
#include "GeneralDefine.h"

#define LOG_FILE       "globalConfig/logFile/robotLog.dat"
#define LOG_XML_FILE       "globalConfig/logFile/robotLog.xml"
//#define ROBOT_PATH      "robotData"
#define LOG_FLODER      "/logFile/"
#define LOG_FILENAME    "robotLog.dat"
#define LOG_MAX_LENGTH 100000

class DomParser;

/**
 * @brief The MessageLog class 消息管理类
 * change:
 * 添加无法翻译字段和原文， 防止：找不到消息翻译内容，显示消息为空。
 *
 */
class MessageLog
{


private:
    /**
     * @brief MessageLog 构造
     */
    MessageLog();
    //析构
    ~MessageLog()
    {
        if(NULL!=messageLog)
        delete messageLog;
        messageLog=NULL;
    }


public:
    bool isDeviceMasterInitialOk();

    int registerComponentVersion(ComponentVersion componentVersionInfo);

    /**
     * @brief messageLog 获取单例化对象
     */
    static MessageLog* getInstance();

    int readVersion(std::vector <ComponentVersion> &componentVersionList);
    std::vector <ComponentVersion> readVersionList();


    /**
     * @brief addLog            添加日志
     * @param addLog            日志
     * @param robotId           机器人号码
     */
    void addLog(Message addLog);
    /**
     * @brief saveLogToFile        保存日志
     */
    void saveLogToFile();

    int saveLogToXmlFile();

    int saveOneMessageToXmlFile(DomParser *domParser, Message log);

    int timerSaveLogToFile();
    /**
     * @brief addMessage    添加消息
     * @param addMsg         消息
     */
    void addMessage(Message addMsg);

    /**
     * @brief clearMessage      清除消息
     * @param msgIndex          消息号
     * @return                  清除标志
     */
    int clearMessage(int msgIndex);

    /**
     * @brief clearMessage      清除消息
     * @return                  清除标志
     */
    int clearAllMessage(   );

    /******************
     * 日期：2017－1－21
     * 修改人：ｓｔｅｖｅｎ
     * 修改内容：添加获取ｍｓｇ的接口，主要用于线程数据保护
     *
     * 日期：2017-2-20
     * 修改人：steven
     * 修改内容：增加判断报警级别的消息（返回值为-1表示有报警级别的消息，0没有）
     * ****************/
    /**
     * @brief updateControllerInfoLevel2
     * @param updateDataLv2
     * @return
     */
    int updateControllerInfoLevel2(std::vector<Message> &msg_vec);
    bool isErrorOccured();

    /**
     * @brief changeMessageLanguage 切换语言
     */
    void changeMessageLanguage(int language);


    /**
     * @brief startOrShutLog            开关机日志
     * @param switchValue               １表示开机，０表示关机
     */
    void startOrShutLog(int switchValue);

    int getCurrentLanguage();

    int getAllMessage(QVector<Message> &messageReturn);

    int getAllLog(QVector<Message> &logReturn);



    //--------------------------------------------------------------------------------------
   private:
     int initial_forLogFileFialed(QString xmlLogFileNameIn);
       /**
        * @brief readLogFile            从文件中读取日志
        * @return
        */
       void readLogFile();

       /**
        * @brief addMessageTime         addMessageTime
        * @param addMsg            消息结构
        * @return
        */
       void addMessageTime(Message &addMsg);
       /**
      * @brief lock
      */
       bool lock(){
               pthread_mutex_lock(&msgThreadLock) ;
               return true;
       }

       /**
      * @brief unlock
      */
       void unlock(){
           pthread_mutex_unlock(&msgThreadLock) ;
       }

       /**
      * @brief trylock
      */
       bool trylock(){
           if( 0==pthread_mutex_trylock(&msgThreadLock) )
           {
               return true;
           }else{
               return false;
           }
       }

       void addMsg( int messageLevel,
                    std::string componentName,
                    std::string messageType,
                    int messageCode,
                    int robotId,
                    int parameter1 = 0,
                    int parameter2 = 0,
                    int parameter3 = 0,
                    int parameter4 = 0,
                    QString message= "");




  //---------------------------------------------------------------
public:\

    /**
     * @brief messageLog 单例指针
     */
    static MessageLog* messageLog;



private:

    /**
     * @brief currentLanguage   当前语言，根据语言获取相应的中文、英文列表
     */
    int currentLanguage;


    /**
     * @brief allMsgList        所有未清除的消息
     */
    QVector <Message> allMsgList;
    /**
     * @brief allLogList        发生的所有日志
     */
    QVector <Message> allLogList;



    /**
   * @brief msgThreadLock ///线程锁
   */
      pthread_mutex_t msgThreadLock;

    /**
   * @brief attr ///线程锁参数
   */
      pthread_mutexattr_t msgAttr;

    /**
     * @brief robotId           机器人号码
     */
    int  robotId;

    QTranslator *m_pTranslator;

    QString logName;
    QString xmlLogFileName;

    std::vector<ComponentVersion> myComponentVersionList;
    ComponentVersion versionInfo;

    bool saveLogFileFlag;

};

#endif // MESSAGELOG_H
